package cn.flying.cloud.base.mail.template;

import java.io.StringWriter;
import java.util.Map;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import cn.flying.cloud.base.mail.exception.MsgException;

/**
 * Velocity模板引擎
 *
 * @author: admin
 * @date: 2024年05月29日 10:20
 * @version: 1.0
 */
@Component
public class VelocityEngineTemplate implements EngineTemplate, InitializingBean {

    private VelocityEngine velocityEngine;

    /**
     * 初始化Velocity引擎配置
     */
    @Override
    public void init() {
        // 创建Velocity引擎实例
        velocityEngine = new VelocityEngine();

//        // 绝对路径读取，指定资源加载器为FileResourceLoader，并设置模板基础目录
//        velocityEngine.setProperty("resource.loader", "file");
//        velocityEngine.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
//        // 替换为你的模板文件夹绝对路径
//        velocityEngine.setProperty("file.resource.loader.path", templateProperties.getPath());

//        velocityEngine.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
//
//        velocityEngine.setProperty("resource.loader", "string");
//        velocityEngine.setProperty("string.resource.loader.class", "org.apache.velocity.runtime.resource.loader.StringResourceLoader");

        velocityEngine.init();
    }

    /**
     * 根据模板生成
     *
     * @param data
     * @param tplName
     * @return
     */
    @Override
    public String process(Map<String, Object> data, String tplName) {
        // 创建上下文并填充数据
        VelocityContext context = new VelocityContext();
        data.forEach(context::put);

        // 将模板与数据结合，生成HTML
        try (StringWriter writer = new StringWriter()) {
            // 获取模板
            Template template = velocityEngine.getTemplate(tplName);
            template.merge(context, writer);
            // 输出生成的HTML
            return writer.toString();
        } catch (Exception e) {
            throw new MsgException("模板生成内容失败", e);
        }
    }

    /**
     * 根据模板生成
     * 允许你直接使用字符串形式的模板内容，而无需将模板保存为文件。
     *
     * @param data       参数
     * @param logTag     标记
     * @param tplContent 模板内容
     * @return
     */
    @Override
    public String process(Map<String, Object> data, String logTag, String tplContent) {
        // 创建上下文并填充数据
        VelocityContext context = new VelocityContext();
        data.forEach(context::put);

        // 将模板与数据结合
        try (StringWriter writer = new StringWriter()) {
            velocityEngine.evaluate(context, writer, logTag, tplContent);
            // 输出生成的HTML
            return writer.toString();
        } catch (Exception e) {
            throw new MsgException("模板生成内容失败", e);
        }
    }

    /**
     * bean初始化
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        init();
    }
}
